#!/bin/bash
#######################################
# FEGE Guillaume
# Juin 2001
#######################################
# Mise a jour de l'ordre de lancement
#des scripts d'installation des paquets
#apres remise a zero du serveur
#
#######################################

#######################################
# Configuration
#######################################
PATH_CRT="$PWD"			# PATH courant
PATH_TMP="$PATH_CRT/temp"	# PATH du dossier temp
PATH_SCS="$PATH_CRT/scs"	# PATH du dossier des scripts de base
PATH_AUTO="$PATH_CRT/auto"	# PATH pour script run

#######################################
# Supression du contenu de TEMP
#######################################
if [ -d "${PATH_TMP}" ]; then
	rm -rf "${PATH_TMP}/"* || (( echo "ne peut vider ${PATH_TMP}" && exit 1 ))
else
	mkdir "${PATH_TMP}" || (( echo "ne peut creer ${PATH_TMP}" && exit 1 ))
fi

#######################################
# suppression du contenue de AUTO
#######################################
if [ -d "${PATH_AUTO}" ]; then
	rm -rf "${PATH_AUTO}/"* || (( echo "ne peut vider ${PATH_AUTO}" && exit 1 ))
else
	mkdir "${PATH_AUTO}" || (( echo "ne peut creer ${PATH_AUTO}" && exit 1 ))
fi

#######################################
# Parcours des scripts de base
#######################################
ls "$PATH_SCS" | egrep ".sh$" > "$PATH_TMP/files"	# Fichier de parcours
while read file ; do
	# Le script doit etre executable	
	if [[ ! ( -x "$PATH_SCS/$file" ) ]] ; then
		continue # si script non executable, on passe au suivant
	fi
	# Affichage
	echo -n "read $file"
	# Recuperation nom du fichier (sans l'extension)
	file_name=`echo $file | cut -d. -f1`
	# Remise a zero du numero de ligne
	i=0
	# Lecture du fichier de script
	while read line ; do
		# Le script doit commencer par : #BEGIN
		if [[ "$i" == "0" && "$line" != "#BEGIN" ]] ; then
			echo -e "\t[ERR]"
			echo "not a script"
			break
		fi
		# Si la ligne est vide, on passe a la suivante
		if [[ "$line" == "" ]] ; then
			continue
		fi
		# Si ligne de fin, on quitte la lecture du fichier de script
		if [[ "$line" == "#END" ]] ; then
			break;
		fi
		# Test si syntaxe de la lligne correcte
		echo "$line" | egrep "#(.+)=(.*)" > /dev/null
		if [[ $? == 0 ]] ; then
			# Var : nom de la variable
			var=`echo "$line" | cut -d# -f2 | cut -d= -f1 | tr " " "_"`
			# Val : valeur de la variable
			val=`echo "$line" | cut -d= -f2`
			# Affectation de la variable
			eval ${file_name}_$var="$val"
		fi
		# Mise a jour compteur de ligne
		eval i=$((i+1))
	done < "./scs/$file"

	# Mise a jour de la variable scs :
	# NOM:NEAD1,NEAD2:FILESC #
	var=${file_name}_name
	if [[ "${!var}" != "" ]] ; then
		scs="$scs#${!var}"
		var=${file_name}_nead
		scs="$scs:${!var}"
		scs="$scs:$PATH_SCS/$file"
		echo -e "\t[OK]"
	fi
done < "$PATH_TMP/files"


## Lecture des fichiers de scripts lu
## => Mise a jour de l'ordre d'execution
## Dans PATH_AUTO

#echo "$scs"

# Mise à jour des compteurs de script crées
i=0
oldi=-1
# Boucle infinie
# Exit la boucle si plus de script à traiter
#ou impossible de continuer
while true
do
	# Si aucun script possible à traiter, on quitte
	if [[ "$i" == "$oldi" ]] ; then
		#break
		i=$((i+1))
	fi
	if (( $i >= 99 )) ; then
		echo "can not make because of nead : "
		echo "$scs" | tr "#" "\n" | cut -d: -f1 | while read sc ; do
			echo "$sc"
		done
		break
	fi

	# Mise a jour de $oldi
	oldi=$i

	# Mise a jour de $scs_next : liste des scripts à traiter suivante
	scs_next=""

	# Si aucun script à traiter, on quitte
	if [[ "$scs" == "" ]] ; then
		break;
	fi

	# Création du fichier des  scripts à traiter
	echo "$scs" | tr "#" "\n" > "$PATH_TMP/scs"
	# Traitement des scripts
	while read sc ; do
		# Si variable script vide, suivante !!!
		if [[ "$sc" == "" ]] ; then
			continue
		fi
		#Lecture des variables utiles
		name=`echo "$sc" | cut -d: -f1`
		neads=`echo "$sc" | cut -d: -f2`
		file_sc=`echo "$sc" | cut -d: -f3`
		#Si aucun besoin, traitement !
		if [[ "$neads" == "" ]] ; then
			echo "#!/bin/bash" > "$PATH_AUTO/$((i+100))$name"
			echo "if [ -d \"$name\" ]; then cd $name; fi" >> "$PATH_AUTO/$((i+100))$name"
			echo "$file_sc" >> "$PATH_AUTO/$((i+100))$name"
			chmod +x "$PATH_AUTO/$((i+100))$name"
			eval ${name}_ok="1"
			echo "Making no nead $name"
			i=$(( i+1 ))
		else
			echo "$neads" | tr "," "\n" > "$PATH_TMP/neads"
			nead_ok=1
			# Parcours des besoins
			while read nead ; do
				#echo $nead
				tmp=${nead}_ok
				# Test si besoin non attein
				if [[ ${!tmp} != 1 ]] ; then
					if (($nead)) 2>/dev/null ; then
						if (($nead > $i )); then
							nead_ok=0
						fi
					else
						nead_ok=0
					fi
				fi
			done < "$PATH_TMP/neads"
			if [[ "$nead_ok" == 0 ]] ; then
				scs_next="$scs_next#$sc"
			else
				echo "#!/bin/bash" > "$PATH_AUTO/$((i+100))$name"
				echo "if [ -d \"$name\" ]; then cd $name; fi" >> "$PATH_AUTO/$((i+100))$name"
				echo "$file_sc" >> "$PATH_AUTO/$((i+100))$name"
				chmod +x "$PATH_AUTO/$((i+100))$name"
				eval ${name}_ok="1"
				echo "Making $name wich nead $neads"
				i=$(( i+1 ))
			fi
		fi
	done < "$PATH_TMP/scs"


	scs=$scs_next;
done

